# python中内置的高阶函数（一）

"""
一、map函数
map函数接受的是两个参数，一个是函数名，另外一个是序列，
其功能是将序列中的数值作为函数的参数依次传入到函数值中执行，然后再返回到列表中。
返回值是一个迭代器对象。
"""

print(map(lambda n: n ** 2, [1, 2, 3, 4, 5, 6]))  # 返回值是一个迭代器对象
print(list(map(lambda n: n ** 2, [1, 2, 3, 4, 5, 6])))

"""
二、reduce函数
reduce函数也是一个参数为函数，另一个参数为序列对象（比如：list列表）。
其返回值为一个值，而不是迭代器对象。
故其常用于叠加、叠成等等。

函数详解：
1.function：一个有两个参数的函数
2.sequence：是一个序列，是一些数据的集合，或者是一组数据，可迭代对象
3.initial：可选，初始参数
4.返回值：返回函数计算的结果
5.reduce（）函数，使用function函数（有两个参数）先对集合中的sequence第1、2个元素进行操作，
如果存在initial参数，则将会以sequence中的第一个元素和initial作为参数，用作调用，
得到的结果再与sequence中的下一个数据用function函数运算，最后得到一个结果。
"""
from functools import reduce

print(reduce(lambda x, y: x + y, [2, 4, 6, 8, 10], 10))

# 复杂案例：有一个长的字符串，统计字符串中每个单词出现的次数
str1 = 'hello world python hello python java hello python flask'
# 第一步，将单词切开
lst = str1.split(' ')
print(lst)
# 第二步，每个单词只要出现了，那么就代表有一次
new_lst = list(map(lambda item: {item: 1}, lst))
print(new_lst)


# 第三步，使用reduce实现相同单词次数的叠加
def func(dict1, dict2):
    # 把dict1作为叠加的返回字典
    key = list(dict2.items())[0][0]  # 得到dict2中的key
    value = list(dict2.items())[0][1]  # 得到dict2中的value
    dict1[key] = dict1.get(key, 0) + value
    return dict1


print(reduce(func, new_lst))

# 简化代码
print(reduce(func, map(lambda item: {item: 1}, str1.split(' '))))
